<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>testD3-35-icicle.html</title>
<style>

.node {
  fill: #ddd;
  stroke: #fff;
}

.label {
  font: 10px sans-serif;
  text-anchor: middle;
}

</style>
</head>
<body>
<p>冰柱图（icicle）</p>
<script src="d3.v3.js" charset="utf-8" ></script>

<script>

var width = 960,
    height = 500;

var color = d3.scale.category20();

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);
// (1)冰柱布局
var partition = d3.layout.partition()//递归分割节点树到一个旭日或冰柱。
    .size([width, height])//在x和y指定的布局大小。
    .value(function(d) { return d.size; });

d3.json("Icicle.json", function(error, root) {
  // (2) 用冰柱图布局转换数据
  var nodes = partition.nodes(root);//计算分区布局并返回节点的数组。

  // (3) 设置文字和节点
  svg.selectAll(".node")
      .data(nodes)
      .enter().append("rect")
      .attr("class", "node")
      .attr("x", function(d) { return d.x; })
      .attr("y", function(d) { return d.y; })
      .attr("width", function(d) { return d.dx; })
      .attr("height", function(d) { return d.dy; })
      .style("fill", function(d) { //颜色:有孩子则返回自己的颜色，无孩子则返回爸爸的颜色
        return color((d.children ? d : d.parent).name);
       });

  svg.selectAll(".label")
      .data(nodes.filter(function(d) {
         return d.dx > 6;
      }))
      .enter().append("text")
      .attr("class", "label")
      .attr("dy", ".35em")
      .attr("transform", function(d) {
        return "translate(" + (d.x + d.dx / 2) + "," + (d.y + d.dy / 2) + ")rotate(90)";
      })
      .text(function(d) { return d.name; });
});

</script>

</body>